home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / MPSRC045.LZH / P16_0101.HAS < prev    next >
Text File  |  1996-11-18  |  4KB  |  132 lines

  1. *=======================================================
  2. *
  3. *    16bitPCM 15.6kHz変換
  4. *
  5. *=======================================================
  6.  
  7. PCM16_0104:
  8. PCM16_0103:
  9. PCM16_0102:
  10. PCM16_0203:
  11. PCM16_0101:
  12.         move.w        CH_VOL(a5),d5        * d5.w = PCM VOLUME
  13.  
  14.         tst.b        CH_KEY_STAT(a5)        * keyon=$01 keyoff=$80 non=$00
  15.         bmi        PCM16_0101_keyoff
  16.         bne        PCM16_0101_keyon
  17.  
  18. *        通常の処理
  19.         movea.l        CH_PCM_ADR(a5),a0    * a0.l = PCMアドレス
  20.         movea.l        CH_TRAP_ADR(a5),a3    * a3.l = トラップアドレス
  21.         movea.l        CH_TRAP_ROUTINE(a5),a4    * a4.l = トラップ時の処理ルーチン
  22.  
  23.         movea.l        CH_JMP_ADR2(a5),a6
  24.         jmp        (a6)
  25.  
  26. *        キーオンの処理
  27. PCM16_0101_keyon:
  28.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  29.  
  30.         clr.w        CH_PITCH_CTR(a5)    * ピッチカウンタクリア
  31.         movea.l        CH_TOP_ADR(a5),a0    * a0.l = PCM先頭アドレス
  32.  
  33.         move.l        CH_LPTIME(a5),d7    * ループ処理があるか?
  34.         moveq.l        #1,d1
  35.         cmp.l        d1,d7            * cmpi.l より4clk速い
  36.         beq        1f
  37.         move.l        d7,CH_LPTIME_CTR(a5)    * ループ回数カウンタ初期化
  38.         movea.l        CH_LPEND_ADR(a5),a3    * a3.l = ループ終了アドレス
  39.         lea.l        PCM16_LPEND,a4        * a4.l = ループ終了処理アドレス
  40.         move.l        a3,CH_TRAP_ADR(a5)
  41.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  42.  
  43.         movea.l        CH_JMP_ADR2(a5),a6
  44.         jmp        (a6)
  45.  
  46. 1:        movea.l        CH_END_ADR(a5),a3    * a3.l = 16bit PCMデータ終了アドレス
  47.         lea.l        PCM16_END,a4        * a4.l = データ終了処理アドレス
  48.         move.l        a3,CH_TRAP_ADR(a5)
  49.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  50.  
  51.         movea.l        CH_JMP_ADR2(a5),a6
  52.         jmp        (a6)
  53.  
  54. *        キーオフの処理
  55. PCM16_0101_keyoff:
  56.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  57.         clr.b        CH_PLAY_FLAG(a5)    * 演奏終了
  58.         jmp        make_keyoff_PCM        * 消音PCM展開
  59.  
  60. *=======================================================
  61.  
  62. PCM16_0101_mac    macro        _vol
  63.  
  64.         move.l        #MIX_SIZE*4-2,d6
  65.         add.l        a0,d6
  66.         cmp.l        a3,d6
  67.         bcs        @f            * 今回の処理中にはトラップしない
  68.  
  69.         moveq.l        #MIX_SIZE*2-1-1,d6
  70. 2:        cmpa.l        a3,a0            * トラップアドレス判定
  71.         bcs        1f
  72.         jsr        (a4)            * トラップ!
  73. 1:        move.w        (a0)+,d0        * PCMデータ取り込み
  74.         VOLUME        _vol,d0,d2
  75.         add.w        d0,(a1)+
  76.         dbra        d6,2b
  77.  
  78. *        ラストの1回
  79.         cmpa.l        a3,a0
  80.         bcs        1f
  81.         jsr        (a4)            * トラップ!
  82. 1:        move.w        (a0)+,d0        * PCMデータ取り込み
  83.         move.w        d0,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d0.w
  84.         VOLUME        _vol,d0,d2
  85.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  86.         add.w        d0,(a1)+
  87.  
  88.         move.l        a0,CH_PCM_ADR(a5)    * PCMアドレス = a0.l
  89.  
  90.         rts
  91.  
  92.         * トラップ無し
  93. @@:        moveq.l        #MIX_SIZE*2-1-1,d6
  94. 2:        move.w        (a0)+,d0        * PCMデータ取り込み
  95.         VOLUME        _vol,d0,d2
  96.         add.w        d0,(a1)+
  97.         dbra        d6,2b
  98.  
  99. *        ラストの1回
  100.         move.w        (a0)+,d0        * PCMデータ取り込み
  101.         move.w        d0,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d0.w
  102.         VOLUME        _vol,d0,d2
  103.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  104.         add.w        d0,(a1)+
  105.  
  106.         move.l        a0,CH_PCM_ADR(a5)    * PCMアドレス = a0.l
  107.  
  108.         rts
  109.  
  110.         endm
  111.  
  112. *=======================================================
  113.  
  114. PCM16_0101_v00:PCM16_0101_mac    0
  115. PCM16_0101_v01:PCM16_0101_mac    1
  116. PCM16_0101_v02:PCM16_0101_mac    2
  117. PCM16_0101_v03:PCM16_0101_mac    3
  118. PCM16_0101_v04:PCM16_0101_mac    4
  119. PCM16_0101_v05:PCM16_0101_mac    5
  120. PCM16_0101_v06:PCM16_0101_mac    6
  121. PCM16_0101_v07:PCM16_0101_mac    7
  122. PCM16_0101_v08:PCM16_0101_mac    8
  123. PCM16_0101_v09:PCM16_0101_mac    9
  124. PCM16_0101_v10:PCM16_0101_mac    10
  125. PCM16_0101_v11:PCM16_0101_mac    11
  126. PCM16_0101_v12:PCM16_0101_mac    12
  127. PCM16_0101_v13:PCM16_0101_mac    13
  128. PCM16_0101_v14:PCM16_0101_mac    14
  129. PCM16_0101_v15:PCM16_0101_mac    15
  130. PCM16_0101_vnn:PCM16_0101_mac    'n'
  131. PCM16_0101_non:PCM16_0101_mac    'x'
  132.